// 引入websocket 包
const ws = require('nodejs-websocket')


// 定义一个初始值，来记录聊天室总认识
let count = 0
// 为了方便维护我们把进入聊天室的状态定义成常量
const Enter = 0
const Leave = 1
const InforMsg = 2

// 创建服务 conn 是给每一个访问的用户创建的服务
const server = ws.createServer(conn => {
    // 只要用户链接上服务就会调用这个函数（也就是这个服务）
    console.log('有用户进来了')
    // 只要用用户进来就count++
    count++

    // 给链接上来的用户起个名字，把他挂载到conn的身上
    conn.userName = `用户${count}`
    // 告诉所有用户，用人加入了聊天室
    broadcast({
        type: Enter,
        msg: `${conn.userName}进入了聊天室`,
        time: new Date().toLocaleTimeString()
    })

    // 监听接收客户端发送的信息
    conn.on('text', data => {
        // 当某个用户发送信息的时候也要给所有用户展示出来
        broadcast({
            type: InforMsg,
            msg: data,
            time: new Date().toLocaleTimeString()
        })
    })

    // 监听客户端石佛断开链接
    conn.on('close', () => {
        console.log('关闭')
        // 每次有人离开就count--
        count--
        // 当有人离开了，也要告诉所有人有人离开了
        broadcast({
            type: Leave,
            msg: `${conn.userName}离开了聊天室`,
            time: new Date().toLocaleTimeString()
        })
    })

    // 注册客户端离开后的处理
    conn.on('error', () => {
        console.log('发生异常')
    })

    // 广播函数，给所有人发送信息   同时我们给客户端响应消息的时候，还可以做优化
    /* 
        分析：
            信息不应该是一个普通的字符串
            他因该是一个对象，这样方便前端进行样式的处理
            type：信息类型， 0表示进入聊天室  1表示离开聊天室  2正常的聊天信息
            msg: 信息的内容
            time：聊天的具体时间
     */
    function broadcast(msg) {
        // server.connections: 表示所有的用户   他是一个数组
        // 然后我们遍历，给每一个人发信息
        server.connections.forEach(item => {
            // 这里msg 传进来的是一个对象了，但是send只能响应字符串，所以要给他转换一下
            item.send(JSON.stringify(msg))
        })
    }
})

// 监听端口
server.listen(3000, () => {
    console.log('websocket Server start up success')
})